home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
fish
/
001-100
/
001-025
/
023
/
ver30
/
symbol.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-17
|
11KB
|
368 lines
/*
* Name: MicroEMACS
* Symbol table stuff.
* Version: 29
* Last edit: 05-Feb-86
* By: rex::conroy
* decvax!decwrl!dec-rhea!dec-rex!conroy
*
* Symbol tables, and keymap setup.
* The terminal specific parts of building the
* keymap has been moved to a better place.
*/
#include "def.h"
#define DIRLIST 0 /* Disarmed! */
/*
* Defined by "main.c".
*/
extern int ctrlg(); /* Abort out of things */
extern int quit(); /* Quit */
extern int ctlxlp(); /* Begin macro */
extern int ctlxrp(); /* End macro */
extern int ctlxe(); /* Execute macro */
extern int jeffexit(); /* Jeff Lomicka style exit. */
extern int showversion(); /* Show version numbers, etc. */
/*
* Defined by "search.c".
*/
extern int forwsearch(); /* Search forward */
extern int backsearch(); /* Search backwards */
extern int searchagain(); /* Repeat last search command */
extern int forwisearch(); /* Incremental search forward */
extern int backisearch(); /* Incremental search backwards */
extern int queryrepl(); /* Query replace */
/*
* Defined by "basic.c".
*/
extern int gotobol(); /* Move to start of line */
extern int backchar(); /* Move backward by characters */
extern int gotoeol(); /* Move to end of line */
extern int forwchar(); /* Move forward by characters */
extern int gotobob(); /* Move to start of buffer */
extern int gotoeob(); /* Move to end of buffer */
extern int forwline(); /* Move forward by lines */
extern int backline(); /* Move backward by lines */
extern int forwpage(); /* Move forward by pages */
extern int backpage(); /* Move backward by pages */
extern int setmark(); /* Set mark */
extern int swapmark(); /* Swap "." and mark */
extern int gotoline(); /* Go to a specified line. */
/*
* Defined by "buffer.c".
*/
extern int listbuffers(); /* Display list of buffers */
extern int usebuffer(); /* Switch a window to a buffer */
extern int killbuffer(); /* Make a buffer go away. */
#if DIRLIST
/*
* Defined by "dirlist.c".
*/
extern int dirlist(); /* Directory list. */
#endif
/*
* Defined by "display.c".
*/
extern int readmsg(); /* Read next line of message. */
/*
* Defined by "file.c".
*/
extern int fileread(); /* Get a file, read only */
extern int filevisit(); /* Get a file, read write */
extern int filewrite(); /* Write a file */
extern int filesave(); /* Save current file */
extern int filename(); /* Adjust file name */
/*
* Defined by "random.c".
*/
extern int selfinsert(); /* Insert character */
extern int showcpos(); /* Show the cursor position */
extern int twiddle(); /* Twiddle characters */
extern int quote(); /* Insert literal */
extern int openline(); /* Open up a blank line */
extern int newline(); /* Insert CR-LF */
extern int deblank(); /* Delete blank lines */
extern int indent(); /* Insert CR-LF, then indent */
extern int forwdel(); /* Forward delete */
extern int backdel(); /* Backward delete */
extern int killline(); /* Kill forward */
extern int yank(); /* Yank back from killbuffer. */
/*
* Defined by "region.c".
*/
extern int killregion(); /* Kill region. */
extern int copyregion(); /* Copy region to kill buffer. */
extern int lowerregion(); /* Lower case region. */
extern int upperregion(); /* Upper case region. */
/*
* Defined by "spawn.c".
*/
extern int spawncli(); /* Run CLI in a subjob. */
/*
* Defined by "window.c".
*/
extern int reposition(); /* Reposition window */
extern int refresh(); /* Refresh the screen */
extern int nextwind(); /* Move to the next window */
extern int prevwind(); /* Move to the previous window */
extern int mvdnwind(); /* Move window down */
extern int mvupwind(); /* Move window up */
extern int onlywind(); /* Make current window only one */
extern int splitwind(); /* Split current window */
extern int enlargewind(); /* Enlarge display window. */
extern int shrinkwind(); /* Shrink window. */
/*
* Defined by "word.c".
*/
extern int backword(); /* Backup by words */
extern int forwword(); /* Advance by words */
extern int upperword(); /* Upper case word. */
extern int lowerword(); /* Lower case word. */
extern int capword(); /* Initial capitalize word. */
extern int delfword(); /* Delete forward word. */
extern int delbword(); /* Delete backward word. */
/*
* Defined by "extend.c".
*/
extern int extend(); /* Extended commands. */
extern int help(); /* Help key. */
extern int bindtokey(); /* Modify key bindings. */
extern int wallchart(); /* Make wall chart. */
typedef struct {
short k_key; /* Key to bind. */
int (*k_funcp)(); /* Function. */
char *k_name; /* Function name string. */
} KEY;
/*
* Default key binding table. This contains
* the function names, the symbol table name, and (possibly)
* a key binding for the builtin functions. There are no
* bindings for C-U or C-X. These are done with special
* code, but should be done normally.
*/
KEY key[] = {
KCTRL|'@', setmark, "set-mark",
KCTRL|'A', gotobol, "goto-bol",
KCTRL|'B', backchar, "back-char",
KCTRL|'C', spawncli, "spawn-cli",
KCTRL|'D', forwdel, "forw-del-char",
KCTRL|'E', gotoeol, "goto-eol",
KCTRL|'F', forwchar, "forw-char",
KCTRL|'G', ctrlg, "abort",
KCTRL|'H', backdel, "back-del-char",
KCTRL|'I', selfinsert, "ins-self",
KCTRL|'J', indent, "ins-nl-and-indent",
KCTRL|'K', killline, "kill-line",
KCTRL|'L', refresh, "refresh",
KCTRL|'M', newline, "ins-nl",
KCTRL|'N', forwline, "forw-line",
KCTRL|'O', openline, "ins-nl-and-backup",
KCTRL|'P', backline, "back-line",
KCTRL|'Q', quote, "quote",
KCTRL|'R', backisearch, "back-i-search",
KCTRL|'S', forwisearch, "forw-i-search",
KCTRL|'T', twiddle, "twiddle",
KCTRL|'V', forwpage, "forw-page",
KCTRL|'W', killregion, "kill-region",
KCTRL|'Y', yank, "yank",
KCTRL|'Z', jeffexit, "jeff-exit",
KCTLX|KCTRL|'B',listbuffers, "display-buffers",
KCTLX|KCTRL|'C',quit, "quit",
#if DIRLIST
KCTLX|KCTRL|'D',dirlist, "display-directory",
#endif
KCTLX|KCTRL|'F',filename, "set-file-name",
KCTLX|KCTRL|'L',lowerregion, "lower-region",
KCTLX|KCTRL|'N',mvdnwind, "down-window",
KCTLX|KCTRL|'O',deblank, "del-blank-lines",
KCTLX|KCTRL|'P',mvupwind, "up-window",
KCTLX|KCTRL|'R',fileread, "file-read",
KCTLX|KCTRL|'S',filesave, "file-save",
KCTLX|KCTRL|'U',upperregion, "upper-region",
KCTLX|KCTRL|'V',filevisit, "file-visit",
KCTLX|KCTRL|'W',filewrite, "file-write",
KCTLX|KCTRL|'X',swapmark, "swap-dot-and-mark",
KCTLX|KCTRL|'Z',shrinkwind, "shrink-window",
KCTLX|'=', showcpos, "display-position",
KCTLX|'(', ctlxlp, "start-macro",
KCTLX|')', ctlxrp, "end-macro",
KCTLX|'1', onlywind, "only-window",
KCTLX|'2', splitwind, "split-window",
KCTLX|'B', usebuffer, "use-buffer",
KCTLX|'E', ctlxe, "execute-macro",
KCTLX|'G', gotoline, "goto-line",
KCTLX|'K', killbuffer, "kill-buffer",
KCTLX|'N', nextwind, "forw-window",
KCTLX|'P', prevwind, "back-window",
KCTLX|'Z', enlargewind, "enlarge-window",
KMETA|KCTRL|'H',delbword, "back-del-word",
KMETA|KCTRL|'R',readmsg, "display-message",
KMETA|KCTRL|'V',showversion, "display-version",
KMETA|'!', reposition, "reposition-window",
KMETA|'>', gotoeob, "goto-eob",
KMETA|'<', gotobob, "goto-bob",
KMETA|'%', queryrepl, "query-replace",
KMETA|'B', backword, "back-word",
KMETA|'C', capword, "cap-word",
KMETA|'D', delfword, "forw-del-word",
KMETA|'F', forwword, "forw-word",
KMETA|'L', lowerword, "lower-word",
KMETA|'R', backsearch, "back-search",
KMETA|'S', forwsearch, "forw-search",
KMETA|'U', upperword, "upper-word",
KMETA|'V', backpage, "back-page",
KMETA|'W', copyregion, "copy-region",
KMETA|'X', extend, "extended-command",
-1, searchagain, "search-again",
-1, help, "help",
-1, wallchart, "display-bindings",
-1, bindtokey, "bind-to-key"
};
#define NKEY (sizeof(key) / sizeof(key[0]))
/*
* Symbol table lookup.
* Return a pointer to the SYMBOL node, or NULL if
* the symbol is not found.
*/
SYMBOL *
symlookup(cp)
register char *cp;
{
register SYMBOL *sp;
sp = symbol[symhash(cp)];
while (sp != NULL) {
if (strcmp(cp, sp->s_name) == 0)
return (sp);
sp = sp->s_symp;
}
return (NULL);
}
/*
* Take a string, and compute the symbol table
* bucket number. This is done by adding all of the characters
* together, and taking the sum mod NSHASH. The string probably
* should not contain any GR characters; if it does the "*cp"
* may get a nagative number on some machines, and the "%"
* will return a negative number!
*/
symhash(cp)
register char *cp;
{
register int c;
register int n;
n = 0;
while ((c = *cp++) != 0)
n += c;
return (n % NSHASH);
}
/*
* Build initial keymap. The funny keys
* (commands, odd control characters) are mapped using
* a big table and calls to "keyadd". The printing characters
* are done with some do-it-yourself handwaving. The terminal
* specific keymap initialization code is called at the
* very end to finish up. All errors are fatal.
*/
keymapinit()
{
register SYMBOL *sp;
register KEY *kp;
register int i;
for (i=0; i<NKEYS; ++i)
binding[i] = NULL;
for (kp = &key[0]; kp < &key[NKEY]; ++kp)
keyadd(kp->k_key, kp->k_funcp, kp->k_name);
keydup(KCTLX|KCTRL|'G', "abort");
keydup(KMETA|KCTRL|'G', "abort");
keydup(0x7F, "back-del-char");
keydup(KCTLX|'R', "back-i-search");
keydup(KCTLX|'S', "forw-i-search");
keydup(KMETA|'.', "set-mark");
keydup(KMETA|'Q', "quote");
keydup(KMETA|0x7F, "back-del-word");
/*
* Should be bound by "tab" already.
*/
if ((sp=symlookup("ins-self")) == NULL)
abort();
for (i=0x20; i<0x7F; ++i) {
if (binding[i] != NULL)
abort();
binding[i] = sp;
++sp->s_nkey;
}
ttykeymapinit();
}
/*
* Create a new builtin function "name"
* with function "funcp". If the "new" is a real
* key, bind it as a side effect. All errors
* are fatal.
*/
keyadd(new, funcp, name)
int (*funcp)();
char *name;
{
register SYMBOL *sp;
register int hash;
if ((sp=(SYMBOL *)malloc(sizeof(SYMBOL))) == NULL)
abort();
hash = symhash(name);
sp->s_symp = symbol[hash];
symbol[hash] = sp;
sp->s_nkey = 0;
sp->s_name = name;
sp->s_funcp = funcp;
if (new >= 0) { /* Bind this key. */
if (binding[new] != NULL)
abort();
binding[new] = sp;
++sp->s_nkey;
}
}
/*
* Bind key "new" to the existing
* routine "name". If the name cannot be found,
* or the key is already bound, abort.
*/
keydup(new, name)
register int new;
char *name;
{
register SYMBOL *sp;
if (binding[new]!=NULL || (sp=symlookup(name))==NULL) {
fprintf (stderr, "keydup: binding[%d] = %x", new, binding[new]);
fprintf (stderr, " and symlookup(%s) == %x\n", name, sp);
fflush (stderr);
abort();
}
binding[new] = sp;
++sp->s_nkey;
}